package top.yuanao.batchzip;

import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import java.awt.*;
import java.io.File;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * Main.java
 *
 * @author Yuanao
 * @date 2021/12/21 15:16
 */
public class Main {

    public static volatile JTextArea showText = new JTextArea();

    /**
     * 唯一的窗口文件
     */
    private static final JFrame MAIN_WINDOW = new JFrame("批量压缩");

    /**
     * 创建线程池
     */
    private static final ThreadPoolExecutor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(1, 12, 60, TimeUnit.MINUTES, new LinkedBlockingQueue<>());

    //最大压缩包大小
    public static Integer maxFileSize = 25;

    //各种组件外露
    public static JLabel fileSizeValue = new JLabel();

    public static boolean executing = false;


    public static void main(String[] args) {

        MAIN_WINDOW.setSize(500, 650);
        //设置在屏幕中间X
        MAIN_WINDOW.setLocationRelativeTo(null);
        //关闭按钮关闭程序
        MAIN_WINDOW.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //设置头像
        MAIN_WINDOW.setIconImage(Toolkit.getDefaultToolkit().getImage(Main.class.getClassLoader().getResource("favicon.png")));
        //禁止改变窗口大小
        MAIN_WINDOW.setResizable(false);

        // 创建面板容器，使用默认的布局管理器
        JPanel panel = new JPanel(null);
        panel.setBackground(new Color(255, 255, 255));


        /**
         * 选择目录文本框
         */
        JLabel selectDirLabel = new JLabel();
        selectDirLabel.setText("请选择你要操作的文件夹:");
        selectDirLabel.setFont(new Font(null, Font.PLAIN, 16));
        selectDirLabel.setBounds(20, 10, 230, 30);
        panel.add(selectDirLabel);


        /**
         * 文件夹目录显示框
         */
        JLabel rootPatLabel = new JLabel();
        rootPatLabel.setText("");
        rootPatLabel.setBounds(20, 40, 400, 20);

        panel.add(rootPatLabel);


        // 3. 创建一个基本组件（按钮），并添加到 面板容器 中
        JButton btn = new JButton("选择目录");
        btn.setBounds(250, 10, 100, 30);
        btn.setBackground(new Color(238, 110, 97));
        btn.setForeground(new Color(255, 255, 255));

        btn.addActionListener(e -> {
            //文件选择类
            JFileChooser fileChooser = new JFileChooser();
            // 设置默认显示的文件夹为当前文件夹
            fileChooser.setCurrentDirectory(new File("".equals(rootPatLabel.getText())? "." : rootPatLabel.getText()));
            //设置只可以选择文件夹
            fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
            //设置文件过滤器
            fileChooser.addChoosableFileFilter(new FileFilter() {
                @Override
                public boolean accept(File f) {
                    return f != null && f.exists() && f.isDirectory();
                }
                @Override
                public String getDescription() {
                    return "文件夹";
                }
            });
            //关闭默认的"所有文件"
            fileChooser.setAcceptAllFileFilterUsed(false);
            //打开选择框,主线程进入阻塞状态
            int option = fileChooser.showOpenDialog(MAIN_WINDOW);
            if (option == JFileChooser.APPROVE_OPTION) {
                //拿到选择的文件
                File file = fileChooser.getSelectedFile();
                //校验并输入工作目录
                if (!Application.inputPath(file)) {
                    JOptionPane.showMessageDialog(MAIN_WINDOW, "选择的文件夹不存在", "错误", JOptionPane.ERROR_MESSAGE);
                    return;
                }
                //填充文本
                rootPatLabel.setText(file.getAbsolutePath());
                //计算数量
                int fileSize = Application.rootFileSize();
                fileSizeValue.setText(String.valueOf(fileSize));
            }
        });
        panel.add(btn);



        /**
         * 设置压缩包大小提示语
         */
        JLabel maxFileSizeLabel = new JLabel();
        maxFileSizeLabel.setText("每个压缩包最大(MB)");
        maxFileSizeLabel.setBounds(20, 90, 180, 30);
        maxFileSizeLabel.setFont(new Font(null, Font.PLAIN, 16));
        panel.add(maxFileSizeLabel);

        //压缩包大小输入框
        JTextField maxFileSizeInput = new JTextField();
        maxFileSizeInput.setEditable(true);
        maxFileSizeInput.setBounds(200, 90, 100, 30);
        maxFileSizeInput.setBackground(new Color(238, 110, 97));
        maxFileSizeInput.setForeground(new Color(255, 255, 255));
        maxFileSizeInput.setFont(new Font(null, Font.PLAIN, 16));
        maxFileSizeInput.setText(maxFileSize.toString());
        //设置文本水平对齐
        maxFileSizeInput.setHorizontalAlignment(JTextField.CENTER);
        panel.add(maxFileSizeInput);

        //目录下文件数量显示
        JLabel fileSizeKey = new JLabel();
        fileSizeKey.setBounds(20, 60, 120, 30);
        fileSizeKey.setFont(new Font(null, Font.PLAIN, 16));
        fileSizeKey.setText("目录下文件数:");
        //设置文本水平对齐
        panel.add(fileSizeKey);

        //文件夹下文件数量
        fileSizeValue.setBounds(20 + 120, 60, 150, 30);
        fileSizeValue.setFont(new Font(null, Font.PLAIN, 16));
        //设置文本水平对齐
        panel.add(fileSizeValue);


        // 开始压缩文件按钮
        JButton startBtn = new JButton("开始");
        startBtn.setBounds(200, 140, 100, 30);
        startBtn.setBackground(new Color(29, 149, 249));
        startBtn.setForeground(new Color(255, 255, 255));

        startBtn.addActionListener(e -> {
            if (executing) {
                toast("错误","程序正在执行中,请勿再次点击");
                return;
            }
            executing = true;
            Application.index = 1;
            //show置空
            showText.setText("");
            addTextToShow("******程序开始****");
            addTextToShow("工作目录:" + rootPatLabel.getText());
            addTextToShow("待处理文件数量:" + fileSizeValue.getText());

            if ("".equals(rootPatLabel.getText())) {
                toast("错误","请先选择工作目录");
                executing = false;
                return;
            }

            //判断输入的大小对不对
            String maxFileSizeInputText = maxFileSizeInput.getText();
            try {
                maxFileSize = Integer.valueOf(maxFileSizeInputText);
                if (maxFileSize <= 0) {
                    toast("错误","压缩包大小不能小于1");
                    maxFileSize = 25;
                    maxFileSizeInput.setText(maxFileSize.toString());
                    executing = false;
                    return;
                }
            } catch (Exception exception) {
                exception.printStackTrace();
                toast("错误","压缩包大小只能输入数字");
                executing = false;
                return;
            }
            //判断创建文件
            if (!Application.mkdirs()) {
                toast("错误","创建临时文件失败");
                executing = false;
                return;
            }
            //执行主程序
            THREAD_POOL_EXECUTOR.execute(() -> {
                Application.run();
                executing = false;
            });
        });
        panel.add(startBtn);


        showText.setBackground(new Color(0, 0, 0));
        showText.setForeground(new Color(255, 255, 255));
        showText.setEditable(false);

        JScrollPane jScrollPane = new JScrollPane(showText);
        jScrollPane.setBounds(20, 190, 455, 370);
        jScrollPane.setBackground(new Color(0, 0, 0));

        panel.add(jScrollPane);

        // 把 面板容器 作为窗口的内容面板 设置到 窗口
        MAIN_WINDOW.setContentPane(panel);

        //设置工具栏
        MAIN_WINDOW.setJMenuBar(getMenuBar());
        //显示窗口
        MAIN_WINDOW.setVisible(true);
    }


    /**
     * 获取状态栏对象
     *
     * @return
     */
    private static JMenuBar getMenuBar() {
        /*
         * 创建一个菜单栏
         */
        JMenuBar menuBar = new JMenuBar();
        menuBar.setBackground(new Color(255, 255, 255));

        /*
         * 创建一级菜单
         */
        JMenu fileMenu = new JMenu("文件");
        JMenu editMenu = new JMenu("编辑");
        JMenu viewMenu = new JMenu("视图");
        JMenu aboutMenu = new JMenu("关于");
        // 一级菜单添加到菜单栏
        menuBar.add(fileMenu);
        menuBar.add(editMenu);
        menuBar.add(viewMenu);
        menuBar.add(aboutMenu);

        /*
         * 创建 "文件" 一级菜单的子菜单
         */
        JMenuItem newMenuItem = new JMenuItem("新建");
        JMenuItem openMenuItem = new JMenuItem("打开");
        JMenuItem exitMenuItem = new JMenuItem("退出");
        // 子菜单添加到一级菜单
        fileMenu.add(newMenuItem);
        fileMenu.add(openMenuItem);
        fileMenu.addSeparator();       // 添加一条分割线
        fileMenu.add(exitMenuItem);


        JMenuItem aboutMenuItem = new JMenuItem("关于本软件");

        aboutMenu.add(aboutMenuItem);




        /*
         * 菜单项的点击/状态改变事件监听，事件监听可以直接设置在具体的子菜单上（这里只设置其中几个）
         */
        // 设置 "新建" 子菜单被点击的监听器
        newMenuItem.addActionListener(e -> JOptionPane.showMessageDialog(MAIN_WINDOW, "别点我", "嗷~~", JOptionPane.ERROR_MESSAGE));
        // 设置 "打开" 子菜单被点击的监听器
        openMenuItem.addActionListener(e -> JOptionPane.showMessageDialog(MAIN_WINDOW, "你烦不烦啊", "嗷~~", JOptionPane.ERROR_MESSAGE));
        // 设置 "退出" 子菜单被点击的监听器
        exitMenuItem.addActionListener(e -> System.exit(1));


        // 设置关于本软件的提示框
        aboutMenuItem.addActionListener(e -> JOptionPane.showMessageDialog(MAIN_WINDOW, "版本: V1.1       ©2022 Yuanao\n主页:https://www.yuanao.top", "关于本软件", JOptionPane.INFORMATION_MESSAGE));

        return menuBar;
    }

    /**
     * 最上面添加一条数据
     * @param text
     */
    public static void addTextToShow(String text) {
        showText.setText(showText.getText() + "\n" + text);
    }
    /**
     * 弹窗
     */
    public static void toast(String title,String msg) {
        JOptionPane.showMessageDialog(MAIN_WINDOW, msg, title, JOptionPane.ERROR_MESSAGE);
    }

}
